<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/3.2.30/vue.global.min.js" type="application/javascript"></script>
</head>
<body>
  
    <div id="app">
           <cp1></cp1>
           
           
    </div>

        
    
    <script>  
           const { defineProps , provide, inject, ref ,onMounted} = Vue;
           const app = Vue.createApp({  //  vue2 new Vue({})
                data(){
                    return {
                        showCp1: true
                    }
                },
                methods:{
                    fn1(res){
                        console.log('我是根组件的fn1',res)
                    }
                }
                
           })


           app.component('cp2',{
                template:`<div>我是cp2组件</div>`,
               
                setup(props,ctx){
                    console.log('ctx', ctx)
                    const ct = ref(1)
                    const fn1 = ()=>{
                        ct.value++
                    }  

                    // 如果调用了 ctx.expose 就会暴露指定的状态或者是函数 外部通过ref得到的当前组件实例只会获得暴露出去的内容
                    // 如果没有调用ctx.expose 就会全部内容都暴露
                    ctx.expose({
                         fn1
                    })
                    
                    return {
                        ct,
                        fn1
                    } 
                }
           })

           //    Vue.component()
           app.component('cp1',{
             template:`<div>    
                            我是cp1组件 
                            <div ref="a"> 123 </div>
                            <cp2 ref="b"></cp2>
                        </div>`,    
             setup(props,ctx){
              
                // 在setup this得不到组件实例所以就没有 this.$refs
                // 只能创建一个 ref对象 然后通过 ref="同名变量"  通过 ref的value来得到对应的实例
                const a = ref();
                onMounted(()=>{
                    console.log('a',a.value)
                })

                const b = ref();
                onMounted(()=>{
                    console.log('b',b.value)
                })


                return {
                    a,
                    b
                }
             }
           })

        
           app.mount('#app') //  vue2  app.$mount()
        

    </script>

</body>
</html>